package com.example.logtestservice.controller;

import com.example.logtestservice.client.LogSender;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

/**
 * 测试控制器 - 提供各种接口模拟不同的日志场景
 */
@RestController
@RequestMapping("/test")
@Slf4j
public class TestController {
    
    @Resource
    private LogSender logSender;
    
    private Random random = new Random();
    
    /**
     * 正常访问接口
     */
    @GetMapping("/normal")
    public Map<String, Object> normal() {
        logSender.info("用户访问正常接口");
        logSender.info("处理正常业务逻辑");
        logSender.info("正常接口处理完成");
        
        Map<String, Object> result = new HashMap<>();
        result.put("code", 200);
        result.put("message", "success");
        result.put("data", "正常处理完成");
        return result;
    }
    
    /**
     * 模拟数据库查询慢
     */
    @GetMapping("/slow-db")
    public Map<String, Object> slowDatabase() {
        logSender.warn("检测到数据库查询较慢");
        logSender.warn("查询SQL: SELECT * FROM large_table WHERE id > 1000");
        logSender.warn("查询耗时: 2500ms");
        
        try {
            Thread.sleep(100); // 模拟慢查询
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        Map<String, Object> result = new HashMap<>();
        result.put("code", 200);
        result.put("message", "查询完成，但较慢");
        return result;
    }
    
    /**
     * 模拟空指针异常
     */
    @GetMapping("/null-pointer")
    public Map<String, Object> nullPointerException() {
        logSender.error("发生空指针异常！");
        logSender.error("异常位置: TestController.nullPointerException()");
        logSender.error("错误堆栈: java.lang.NullPointerException: Cannot invoke method on null object");
        logSender.error("at com.example.logtestservice.controller.TestController.nullPointerException(TestController.java:65)");
        
        Map<String, Object> result = new HashMap<>();
        result.put("code", 500);
        result.put("message", "服务器内部错误");
        result.put("error", "NullPointerException");
        return result;
    }
    
    /**
     * 模拟数据库连接失败
     */
    @GetMapping("/db-connection-error")
    public Map<String, Object> databaseConnectionError() {
        logSender.error("数据库连接失败！");
        logSender.error("错误信息: Could not open JDBC Connection for transaction");
        logSender.error("数据库地址: jdbc:mysql://localhost:3306/test_db");
        logSender.error("可能原因: 1.数据库服务未启动 2.连接池已满 3.网络问题");
        
        Map<String, Object> result = new HashMap<>();
        result.put("code", 500);
        result.put("message", "数据库连接失败");
        return result;
    }
    
    /**
     * 模拟网络超时
     */
    @GetMapping("/network-timeout")
    public Map<String, Object> networkTimeout() {
        logSender.error("调用外部API超时");
        logSender.error("目标地址: http://external-api.example.com/data");
        logSender.error("超时时间: 30000ms");
        logSender.error("错误信息: java.net.SocketTimeoutException: Read timed out");
        
        Map<String, Object> result = new HashMap<>();
        result.put("code", 504);
        result.put("message", "网络请求超时");
        return result;
    }
    
    /**
     * 模拟内存溢出警告
     */
    @GetMapping("/memory-warning")
    public Map<String, Object> memoryWarning() {
        logSender.warn("内存使用率较高");
        logSender.warn("当前堆内存使用: 1800MB / 2048MB");
        logSender.warn("内存使用率: 87.9%");
        logSender.warn("建议: 检查是否存在内存泄漏");
        
        Map<String, Object> result = new HashMap<>();
        result.put("code", 200);
        result.put("message", "内存警告已记录");
        return result;
    }
    
    /**
     * 模拟用户认证失败
     */
    @GetMapping("/auth-failed")
    public Map<String, Object> authenticationFailed() {
        logSender.warn("用户认证失败");
        logSender.warn("用户名: test_user");
        logSender.warn("IP地址: 192.168.1.100");
        logSender.warn("失败原因: 密码错误");
        logSender.warn("连续失败次数: 3");
        
        Map<String, Object> result = new HashMap<>();
        result.put("code", 401);
        result.put("message", "认证失败");
        return result;
    }
    
    /**
     * 模拟并发访问
     */
    @GetMapping("/concurrent-access")
    public Map<String, Object> concurrentAccess() {
        int threadCount = random.nextInt(50) + 10;
        logSender.info("检测到高并发访问");
        logSender.info("当前并发线程数: " + threadCount);
        
        if (threadCount > 40) {
            logSender.warn("并发数过高，系统压力较大");
            logSender.warn("建议: 考虑限流或扩容");
        }
        
        Map<String, Object> result = new HashMap<>();
        result.put("code", 200);
        result.put("message", "并发访问处理完成");
        result.put("threadCount", threadCount);
        return result;
    }
    
    /**
     * 模拟文件操作失败
     */
    @GetMapping("/file-operation-error")
    public Map<String, Object> fileOperationError() {
        logSender.error("文件操作失败");
        logSender.error("操作类型: 读取文件");
        logSender.error("文件路径: /data/uploads/file.txt");
        logSender.error("错误信息: java.io.FileNotFoundException: 文件不存在");
        
        Map<String, Object> result = new HashMap<>();
        result.put("code", 500);
        result.put("message", "文件操作失败");
        return result;
    }
    
    /**
     * 模拟业务逻辑错误
     */
    @GetMapping("/business-error")
    public Map<String, Object> businessError() {
        logSender.warn("业务逻辑校验失败");
        logSender.warn("错误类型: 库存不足");
        logSender.warn("商品ID: 12345");
        logSender.warn("请求数量: 100");
        logSender.warn("当前库存: 50");
        
        Map<String, Object> result = new HashMap<>();
        result.put("code", 400);
        result.put("message", "库存不足");
        return result;
    }
    
    /**
     * 批量生成混合日志
     */
    @GetMapping("/generate-batch")
    public Map<String, Object> generateBatchLogs(@RequestParam(defaultValue = "10") int count) {
        logSender.info("开始批量生成日志，数量: " + count);
        
        for (int i = 0; i < count; i++) {
            int type = random.nextInt(5);
            switch (type) {
                case 0:
                    logSender.info("批量日志[" + i + "]: 正常业务处理");
                    break;
                case 1:
                    logSender.warn("批量日志[" + i + "]: 系统响应较慢");
                    break;
                case 2:
                    logSender.error("批量日志[" + i + "]: 发生错误 - 数据验证失败");
                    break;
                case 3:
                    logSender.debug("批量日志[" + i + "]: 调试信息 - 参数值检查");
                    break;
                case 4:
                    logSender.warn("批量日志[" + i + "]: 缓存未命中");
                    break;
            }
            
            try {
                Thread.sleep(100); // 间隔100ms
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        
        logSender.info("批量日志生成完成");
        
        Map<String, Object> result = new HashMap<>();
        result.put("code", 200);
        result.put("message", "成功生成" + count + "条日志");
        return result;
    }
    
    /**
     * 健康检查接口
     */
    @GetMapping("/health")
    public Map<String, Object> health() {
        logSender.debug("健康检查");
        
        Map<String, Object> result = new HashMap<>();
        result.put("status", "UP");
        result.put("service", "log-test-service");
        result.put("timestamp", System.currentTimeMillis());
        return result;
    }
}
